//package cn.nkpro.elcube.co.quartz;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import org.quartz.CronScheduleBuilder;
//import org.quartz.CronTrigger;
//import org.quartz.Job;
//import org.quartz.JobBuilder;
//import org.quartz.JobDetail;
//import org.quartz.JobExecutionContext;
//import org.quartz.JobKey;
//import org.quartz.Scheduler;
//import org.quartz.SimpleScheduleBuilder;
//import org.quartz.SimpleTrigger;
//import org.quartz.Trigger;
//import org.quartz.TriggerBuilder;
//import org.quartz.TriggerKey;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
///**
// *
// * todo 待调整
// * Quartz任务调度管理
// */
//@Component
//public class QuartzManager {
//
//	@Autowired
//	private Scheduler scheduler;
//
//	/**
//	 * 添加一个定时Cron任务
//	 * @param id 任务id
//	 * @param jobClass 任务实现类
//	 * @param cron 表达式参考quartz说明文档
//	 */
//	public void addCronJob(Long id, Class jobClass,String cron) {
//		addCronJob(id, jobClass, cron, new HashMap<>());
//	}
//
//	/**
//	 * /**
//	 * 添加一个定时Cron任务
//	 * @param id 任务id
//	 * @param jobClass 任务实现类
//	 * @param cron 表达式参考quartz说明文档
//	 * @param params 参数内容
//	 */
//	public void addCronJob(Long id, Class jobClass,String cron, Map<String,Object> params) {
//		String jobName          = "QuartzJob@"+id;
//        String jobGroupName     = "QuartzJobGroup@"+id;
//        String triggerName      = "QuartzTrigger@"+id;
//        String triggerGroupName = "QuartzTriggerGroup@"+id;
//        addCronJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron, params);
//	}
//
//
//	/**
//     * 添加一个定时Cron任务
//     *
//     * @param jobName 任务名
//     * @param jobGroupName 任务组名
//     * @param triggerName 触发器名
//     * @param triggerGroupName 触发器组名
//     * @param jobClass 任务
//     * @param cron 时间设置，参考quartz说明文档
//     */
//    @SuppressWarnings({"unchecked", "rawtypes"})
//    public void addCronJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass,
//                           String cron, Map<String,Object> params) {
//        try {
//            if(checkExists(jobName, jobGroupName, triggerName, triggerGroupName)) {
//              //先移除后添加
//                removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
//            }
//            // 任务名，任务组，任务执行类
//            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
//            if(params != null && params.size() > 0){
//                for(String key :params.keySet()){
//                    jobDetail.getJobDataMap().put(key,params.get(key));
//                }
//            }
//            // 触发器
//            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
//            // 触发器名,触发器组
//            triggerBuilder.withIdentity(triggerName, triggerGroupName);
//            triggerBuilder.startNow();
//            // 触发器时间设定
//            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
//            // 创建Trigger对象
//            CronTrigger trigger = (CronTrigger)triggerBuilder.build();
//
//            // 调度容器设置JobDetail和Trigger
//            scheduler.scheduleJob(jobDetail, trigger);
//            // 启动
//            if (!scheduler.isShutdown()) {
//                scheduler.start();
//            }
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//
//        }
//    }
//
//    /**
//	 * 添加一个定时Simple任务
//	 * @param id 任务id
//	 * @param jobClass 任务实现类
//	 * @param startTime 任务开始时间
//	 */
//	public void addSimpleExecuteOnceJob(Long id, Class jobClass,Date startTime) {
//		addSimpleExecuteOnceJob(id, jobClass, startTime, new HashMap<String, Object>());
//	}
//
//	/**
//	 * /**
//	 * 添加一个定时Simple任务
//	 * @param id 任务id
//	 * @param jobClass 任务实现类
//	 * @param startTime 任务开始时间
//	 * @param params 参数内容
//	 */
//	public void addSimpleExecuteOnceJob(Long id, Class jobClass,Date startTime, Map<String,Object> params) {
//		String jobName = "QuartzJob@"+id;
//        String jobGroupName = "QuartzJobGroup@"+id;
//        String triggerName = "QuartzTrigger@"+id;
//        String triggerGroupName = "QuartzTriggerGroup@"+id;
//        addSimpleExecuteOnceJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, startTime, params);
//	}
//
//    /**
//     * addSimpleExecuteOnceJob 执行一次
//     * @param jobName
//     * @param jobGroupName
//     * @param triggerName
//     * @param triggerGroupName
//     * @param jobClass
//     * @param startTime
//     */
//    public void addSimpleExecuteOnceJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
//        Class jobClass, Date startTime, Map<String,Object> params) {
//        try {
//            if(checkExists(jobName, jobGroupName, triggerName, triggerGroupName)) {
//                //先移除后添加
//                  removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
//              }
//            // 任务名，任务组，任务执行类
//            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
//            if(params != null && params.size() > 0){
//                for(String key :params.keySet()){
//                    jobDetail.getJobDataMap().put(key,params.get(key));
//                }
//            }
//            // 触发器
//            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
//            // 触发器名,触发器组
//            triggerBuilder.withIdentity(triggerName, triggerGroupName);
//            triggerBuilder.startNow();
//            // 触发器
//            SimpleScheduleBuilder simpleSchedule = SimpleScheduleBuilder.simpleSchedule();
//            // 触发器时间设定
//            triggerBuilder.withSchedule(simpleSchedule);
//            triggerBuilder.startAt(startTime);
//            SimpleTrigger trigger = (SimpleTrigger)triggerBuilder.build();
//            // 调度容器设置JobDetail和Trigger
//            scheduler.scheduleJob(jobDetail, trigger);
//            // 启动
//            if (!scheduler.isShutdown()) {
//                scheduler.start();
//            }
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//
//        }
//    }
//
//
//    /**
//     * @Description: 修改一个任务的触发时间
//     *
//     * @param jobName
//     * @param jobGroupName
//     * @param triggerName
//     *            触发器名
//     * @param triggerGroupName
//     *            触发器组名
//     * @param cron
//     *            时间设置，参考quartz说明文档
//     */
//    public void modifyCronJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cron) {
//        try {
//            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
//            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
//            if (trigger == null) {
//                return;
//            }
//
//            String oldTime = trigger.getCronExpression();
//            if (!oldTime.equalsIgnoreCase(cron)) {
//                System.out.println("任务：" + jobName + "被修改");
//                /** 方式一 ：调用 rescheduleJob 开始 */
//                /* // 触发器
//                 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
//                 // 触发器名,触发器组
//                 triggerBuilder.withIdentity(triggerName, triggerGroupName);
//                 triggerBuilder.startNow();
//                 // 触发器时间设定
//                 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
//                 // 创建Trigger对象
//                 trigger = (CronTrigger) triggerBuilder.build();
//                 // 方式一 ：修改一个任务的触发时间
//                 scheduler.rescheduleJob(triggerKey, trigger);*/
//                /** 方式一 ：调用 rescheduleJob 结束 */
//
//                /** 方式二：先删除，然后在创建一个新的Job */
//                JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
//                Class<? extends Job> jobClass = jobDetail.getJobClass();
//                removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
//                addCronJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron,null);
//                /** 方式二 ：先删除，然后在创建一个新的Job */
//            }
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    /**
//     * @Description: 移除一个任务
//     *
//     * @param jobName
//     * @param jobGroupName
//     * @param triggerName
//     * @param triggerGroupName
//     */
//    public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
//        try {
//            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
//            scheduler.pauseTrigger(triggerKey);// 停止触发器
//            scheduler.unscheduleJob(triggerKey);// 移除触发器
//            scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务
//
//
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    /**
//     * 检查是否存在
//     * @param jobName
//     * @param jobGroupName
//     * @param triggerName
//     * @param triggerGroupName
//     * @return
//     */
//    public boolean checkExists(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
//        try {
//            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
//            JobKey jobKey = new JobKey(jobName, jobGroupName);
//            boolean triggerCheck = scheduler.checkExists(triggerKey);
//            boolean jobCheck = scheduler.checkExists(jobKey);
//            return triggerCheck || jobCheck;
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return false;
//    }
//
//    /**
//     * @Description:启动所有定时任务
//     */
//    public void startJobs() {
//        try {
//            scheduler.start();
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    /**
//     * @Description:关闭所有定时任务
//     */
//    public void shutdownJobs() {
//        try {
//            if (!scheduler.isShutdown()) {
//                scheduler.shutdown();
//            }
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    /**
//     * 获取当前正在执行的任务
//     *
//     * @return
//     */
//    public boolean getCurrentJobs(String name) {
//        try {
//            List<JobExecutionContext> jobContexts = scheduler.getCurrentlyExecutingJobs();
//            for (JobExecutionContext context : jobContexts) {
//                if (name.equals(context.getTrigger().getJobKey().getName())) {
//                    return true;
//                }
//            }
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//        return false;
//    }
//
//}
